#ifndef __MEMERY_H
#define __MEMERY_H

#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define USE_ASSERT          0

#define MEM_MAX_SIZE        (60*1024)    //内存池大小
#define BLOCK_NUM           12          //块数，也可理解为最大嵌套层数
#define ALIGN_WIDE          4           //字节对齐宽度，32位机4  16位机2   8位机1

#if(USE_ASSERT == 1)
#define ASSERT(condition)   while(condition)
#else
#define ASSERT(condition)   
#endif

typedef struct{
    uint16_t UseLen;                //本块的长度，为0则认为本块未使用
    uint32_t AddrStart;             //本块首地址(相对于池首的偏移)
    uint32_t AddrEnd;               //本块结束地址(相对于池首的偏移)
}MemBlockTypdef;                    //块结构

typedef struct{
    uint8_t         isPoolOverFlow;     //是否存在内存池溢出（内存池不够用）
    uint8_t         UsedBlock;          //已申请的块数
    uint8_t         MaxUsedBlock;       //最深申请块数
    uint32_t        MaxUsedSize;        //最大申请空间
    MemBlockTypdef  block[BLOCK_NUM];   //块
    uint8_t         pool[MEM_MAX_SIZE]; //池
}MemPoolTypedef;                        //内存池结构

typedef struct{
    void (*test)(void);             //测试用例
    void (*init)(void);             //初始化
    void*(*malloc)(uint32_t size);  //申请
    void (*free)(void *pbuf);       //释放
}MemPoolIfTypedef;                  //内存池模块接口         

extern MemPoolIfTypedef Mem;

#endif